import {
  getRoleListApi,
  delRightsByIdApi,
  setRoleRightsApi
} from '@/api/role'
import {
  getRightsListApi
} from '@/api/privilege'
export default {
  data() {
    return {
      rolesList: [],
      // 为角色分配权限的对话框控制
      setRightDialogVisible: false,
      // 获取树状的权限列表
      rightsList: [],
      // 树形组件默认显示的数据项及关联的字段
      defaultProps: {
        children: 'children', // 关联关系的字段
        label: 'authName' // 要显示的字段
      },
      // 默认选中的三级权限的节点id
      defKeys: [],
      // 保存当前要分配权限的角色信息
      editRole: ''
    }
  },
  created() {
    this.getRoleList()
  },
  methods: {
    // 分配权限
    // 展示分配权限的树形图
    async showSetRightDialog(role) {
      this.editRole = role
      /*  let keys=[];
       //获取一级权限
       let first=role.children;
       first.forEach(function(item1) {
           //获取二级权限
           let second=item1.children;
           second.forEach(function(item2){
             //获取三级权限
              let third=item2.children;
              third.forEach(function(item3){
                  keys.push(item3.id);
              })
           })
       }) */

      /*  let data=[];
       this.getLeafKeys(role, data)
       this.defKeys=data; */
      this.getLeafKeys(role, this.defKeys)
      // 查询出所有的树形权限
      this.rightsList = await getRightsListApi('tree')
      this.setRightDialogVisible = true
    },

    // 分配权限
    async setRoleRights() {
      // 获取要分配角色的角色id
      const roleId = this.editRole.id
      // 获取被选中的三级节点的id组合
      const thirdIds = this.$refs.tree.getCheckedKeys()
      // 获取半选的一二级节点的id组合
      const halfIds = this.$refs.tree.getHalfCheckedKeys()
      let rids = [...halfIds, ...thirdIds]
      // 把数组转换成字符串
      rids = rids.join()
      const res = await setRoleRightsApi(roleId, rids)
      if (res === null) {
        this.$message.success('分配权限成功')
        this.setRightDialogVisible = false
        this.getRoleList()
      }
    },
    /**
     * 递归算法：猴子吃桃，第一天吃总数的一半多1个，第二天又吃剩余总数的一半多1个，依次类推，第10天只剩下1个桃子了，问：原来有多少个桃子?
     */
    // 通过递归的形式获取角色下所有三级权限的id，并保存到defKeys数组中
    getLeafKeys(node, arr) {
      // 递归出口
      if (!node.children) {
        // 已经是三级权限
        return arr.push(node.id)
      }
      // 有子节点，不是三级权限
      node.children.forEach(item => {
        // 递归入口:发现二级权限的处理方式和一级权限的处理方式是一样的
        this.getLeafKeys(item, arr)
      })
    },
    // 监听分配权限的对话框关闭事件
    closeDialog() {
      // 置空默认选中的权限
      this.defKeys = []
    },
    // 获取角色列表
    async getRoleList() {
      const res = await getRoleListApi()
      // console.log(res);
      this.rolesList = res
    },
    // 删除权限
    async delRights(role, rightsId) {
      const confirmResult = await this.$msb.confirm('您确定要删除数据吗?, 是否继续?', '提示', {
        confirmButtonText: '确定',
        cancelButtonText: '取消',
        type: 'warning'
      }).catch(err => err)

      if (confirmResult !== 'confirm') {
        return this.$message.info('已取消删除')
      }
      // 删除成功后返回的是该角色最新的权限列表
      const res = await delRightsByIdApi(role.id, rightsId)
      this.$message.success('删除权限成功!')
      // 给该角色的数据重新赋值：利用数组的子元素的改变会影响原数组的改变
      role.children = res
    }
  }
}
